1091. 二进制矩阵中的最短路径【中等】
1. 📝 题目描述
给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径,返回 -1。
二进制矩阵中的 畅通路径 是一条从 左上角 单元格(即,(0, 0))到 右下角 单元格(即,(n - 1, n - 1))的路径,该路径同时满足下述要求:
- 路径途经的所有单元格的值都是
0。 - 路径中所有相邻的单元格应当在 8 个方向之一 上连通(即,相邻两单元之间彼此不同且共享一条边或者一个角)。
畅通路径的长度 是该路径途经的单元格总数。
示例 1:

txt
输入:grid = [[0,1],[1,0]]
输出:21
2
2
示例 2:

txt
输入:grid = [[0,0,0],[1,1,0],[1,1,0]]
输出:41
2
2
示例 3:
txt
输入:grid = [[1,0,0],[1,1,0],[1,1,0]]
输出:-11
2
2
提示:
n == grid.lengthn == grid[i].length1 <= n <= 100grid[i][j]为0或1
2. 🎯 s.1 - BFS
js
/**
* @param {number[][]} grid
* @return {number}
*/
var shortestPathBinaryMatrix = function (grid) {
const n = grid.length
if (grid[0][0] || grid[n - 1][n - 1]) return -1
const dirs = [
[-1, -1],
[-1, 0],
[-1, 1],
[0, -1],
[0, 1],
[1, -1],
[1, 0],
[1, 1],
]
const queue = [[0, 0]]
grid[0][0] = 1
let dist = 1
while (queue.length) {
const size = queue.length
for (let q = 0; q < size; q++) {
const [r, c] = queue.shift()
if (r === n - 1 && c === n - 1) return dist
for (const [dr, dc] of dirs) {
const nr = r + dr,
nc = c + dc
if (nr >= 0 && nr < n && nc >= 0 && nc < n && grid[nr][nc] === 0) {
grid[nr][nc] = 1
queue.push([nr, nc])
}
}
}
dist++
}
return -1
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
- 时间复杂度:
,其中 是矩阵的边长 - 空间复杂度:
,队列的开销
算法思路:
- 从左上角出发,BFS 按层遍历,8 个方向扩展
- 访问过的格子标记为 1 避免重复访问
- 首次到达右下角时的层数即为最短路径长度